﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.IO;
using System.Xml;


namespace BibliotecaClasse
{
    public class DAOXMLDespetador
    {

        /**
         * construtor cria arquivo se não existir
         */
        public DAOXMLDespetador()
        {
            if (!File.Exists("Alarmes.xml"))
            {
                XmlDocument arquivoXML = new XmlDocument();
                XmlNode tipoObjeto = arquivoXML.CreateElement("Alarme");
                arquivoXML.AppendChild(tipoObjeto);
                arquivoXML.Save("Alarmes.xml");
            }
        }


        /**
         * método para listar alarmes cadastrados
         * para cada alarme no arquivo xml
         * será instanciado um objeto do tipo Alarme.
        */
        public List<Alarme> ListarAlarmes()
        {
            List<Alarme> lista = new List<Alarme>();
            XElement xml = XElement.Load("Alarmes.xml");

            foreach (XElement alarmXML in xml.Elements())
            {
                Alarme alarm = new Alarme()
                {
                    Cod = Convert.ToInt32(alarmXML.Attribute("cod").Value),
                    Hora = alarmXML.Attribute("hora").Value,
                    Dia = alarmXML.Attribute("dia").Value,
                    Desc = alarmXML.Attribute("desc").Value,
                    Ativo = alarmXML.Attribute("ativo").Value
                };


                lista.Add(alarm);
            }
            return lista;
        }

        
        /**
         * método para gerar codigo
         */ 
        public int GerarCod(List<Alarme> list)
        {
            if (list.Count() == 0)
            {
                return 1;
            }
            else
            {
                return (list.ElementAt(list.Count() - 1).Cod) + 1;
            } 
        }

        /**
         * método para adicionar alarme ao arquivo xml
         */
        public void AdicionarAlarme(Alarme alarm)
        {

            XElement elemento = new XElement("alarme");
            elemento.Add(new XAttribute("cod", GerarCod(ListarAlarmes())));
            elemento.Add(new XAttribute("hora", alarm.Hora));
            elemento.Add(new XAttribute("dia", alarm.Dia));
            elemento.Add(new XAttribute("desc", alarm.Desc));
            elemento.Add(new XAttribute("ativo", alarm.Ativo));

            XElement xml = XElement.Load("Alarmes.xml");
            xml.Add(elemento);
            xml.Save("Alarmes.xml");

        }


        /**
        * método para excluir alarme ao arquivo xml
        */
        public void ExcluirAlarme(int cod)
        {
            XElement xml = XElement.Load("Alarmes.xml");
            XElement elemento = xml.Elements().Where(e => e.Attribute("cod").Value.Equals(Convert.ToString(cod))).First();

            if (elemento != null)
            {
                elemento.Remove();
            }
            xml.Save("Alarmes.xml");
        }

        /**
        * método para editar alarme ao arquivo xml
        */
        public void EditarAlarme(Alarme alarm)
        {
            XElement xml = XElement.Load("Alarmes.xml");
            XElement elemento = xml.Elements().Where(e => e.Attribute("cod").Value.Equals(Convert.ToString(alarm.Cod))).First();
            if (elemento != null)
            {
                elemento.Attribute("hora").SetValue(alarm.Hora);
                elemento.Attribute("dia").SetValue(alarm.Dia);
                elemento.Attribute("ativo").SetValue(alarm.Ativo);
                elemento.Attribute("desc").SetValue(alarm.Desc);
            }
            xml.Save("Alarmes.xml");
        }

        /**
         * método para editar alarme ao arquivo xml
         */
        public Boolean VerificarExiste(int cod)
        {
            XElement xml = XElement.Load("Alarmes.xml");
            
            if (xml.Elements().Count(e => e.Attribute("cod").Value.Equals(Convert.ToString(cod))) > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }



    }

}
